#include <iostream>
using namespace std;
/* 用一个表达式判断一个数X是否是2^N次方。 */
int func(int x)
{
    return !(x & (x - 1));
}

/* 求两数的平均值*/
int fc2(int x, int y)
{

    // 前一个 (x&y) 两数相同位之和除以2
    // 后一个 (x^y) 两数不同位之和   >>1 ： 右移1位，即除2
    // 结果为  (x + y) / 2
    return (x & y) + ((x ^ y) >> 1);
}

/*利用位运算进行加法计算*/
int Add(int a, int b)
{
    if (b == 0)
        return a; // 当没有进位时，完成计算
    int sum, carry;
    sum = a ^ b;          // 完成第一步没有进位的加法运算。
    carry = (a & b) << 1; // 完成第二步进位并且左移运算
    return Add(sum, carry);
}
#pragma pack(1)
struct Te
{
    char cValue;
    int iValue;
};
#pragma pack()
int main()
{
    int result = fc2(729, 271);

    cout << result << "\n"
         << fc2(620, 380) << endl;
    cout << "Size of char " << sizeof(char) << endl;
    cout << "Size of int " << sizeof(int) << endl;
    cout << "Size of Struct " << sizeof(Te) << endl;
}